{
  stdenv,
  lib,
  fetchFromGitHub,
  fetchpatch,
  fetchurl,
  cmake,
  pkg-config,
  doxygen,
  libX11,
  libXinerama,
  libXrandr,
  libGLU,
  libGL,
  glib,
  libxml2,
  pcre,
  zlib,
  boost,
  jpegSupport ? true,
  libjpeg,
  exrSupport ? false,
  openexr,
  gifSupport ? true,
  giflib,
  pngSupport ? true,
  libpng,
  tiffSupport ? true,
  libtiff,
  gdalSupport ? false,
  gdal,
  curlSupport ? true,
  curl,
  colladaSupport ? false,
  collada-dom,
  opencascadeSupport ? false,
  opencascade-occt,
  ffmpegSupport ? false,
  ffmpeg,
  nvttSupport ? false,
  nvidia-texture-tools,
  freetypeSupport ? true,
  freetype,
  svgSupport ? false,
  librsvg,
  pdfSupport ? false,
  poppler,
  vncSupport ? false,
  libvncserver,
  lasSupport ? false,
  libLAS,
  luaSupport ? false,
  lua,
  sdlSupport ? false,
  SDL2,
  restSupport ? false,
  asio,
  withApps ? false,
  withExamples ? false,
  fltk,
}:

stdenv.mkDerivation rec {
  pname = "openscenegraph";
  version = "3.6.5";

  src = fetchFromGitHub {
    owner = "openscenegraph";
    repo = "OpenSceneGraph";
    rev = "OpenSceneGraph-${version}";
    sha256 = "00i14h82qg3xzcyd8p02wrarnmby3aiwmz0z43l50byc9f8i05n1";
  };

  nativeBuildInputs = [
    pkg-config
    cmake
    doxygen
  ];

  buildInputs =
    lib.optionals (!stdenv.hostPlatform.isDarwin) [
      libX11
      libXinerama
      libXrandr
      libGLU
      libGL
    ]
    ++ [
      glib
      libxml2
      zlib
    ]
    ++ lib.optional jpegSupport libjpeg
    ++ lib.optional exrSupport openexr
    ++ lib.optional gifSupport giflib
    ++ lib.optional pngSupport libpng
    ++ lib.optional tiffSupport libtiff
    ++ lib.optional gdalSupport gdal
    ++ lib.optional curlSupport curl
    ++ lib.optionals colladaSupport [
      collada-dom
      pcre
    ]
    ++ lib.optional opencascadeSupport opencascade-occt
    ++ lib.optional ffmpegSupport ffmpeg
    ++ lib.optional nvttSupport nvidia-texture-tools
    ++ lib.optional freetypeSupport freetype
    ++ lib.optional svgSupport librsvg
    ++ lib.optional pdfSupport poppler
    ++ lib.optional vncSupport libvncserver
    ++ lib.optional lasSupport libLAS
    ++ lib.optional luaSupport lua
    ++ lib.optional sdlSupport SDL2
    ++ lib.optional restSupport asio
    ++ lib.optionals withExamples [ fltk ]
    ++ lib.optional (restSupport || colladaSupport) boost;

  env = lib.optionalAttrs colladaSupport { COLLADA_DIR = collada-dom; };

  patches = [
    (fetchpatch {
      name = "opencascade-api-patch";
      url = "https://github.com/openscenegraph/OpenSceneGraph/commit/bc2daf9b3239c42d7e51ecd7947d31a92a7dc82b.patch";
      hash = "sha256-VR8YKOV/YihB5eEGZOGaIfJNrig1EPS/PJmpKsK284c=";
    })
    # OpenEXR 3 support: https://github.com/openscenegraph/OpenSceneGraph/issues/1075
    (fetchurl {
      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/dev-games/openscenegraph/files/openscenegraph-3.6.5-openexr3.patch?id=0f642d8f09b589166f0e0c0fc84df7673990bf3f";
      hash = "sha256-fdNbkg6Vp7DeDBTe5Zso8qJ5v9uPSXHpQ5XlGkvputk=";
    })
    # Fix compiling with libtiff when libtiff is compiled using CMake
    (fetchurl {
      url = "https://github.com/openscenegraph/OpenSceneGraph/commit/9da8d428f6666427c167b951b03edd21708e1f43.patch";
      hash = "sha256-YGG/DIHU1f6StbeerZoZrNDm348wYB3ydmVIIGTM7fU=";
    })
  ];

  # ref. https://github.com/openscenegraph/OpenSceneGraph/pull/1373
  postPatch = ''
    substituteInPlace CMakeLists.txt --replace-fail \
      "CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0 FATAL_ERROR)" \
      "CMAKE_MINIMUM_REQUIRED(VERSION 3.10)"
  '';

  cmakeFlags =
    lib.optional (!withApps) "-DBUILD_OSG_APPLICATIONS=OFF"
    ++ lib.optional withExamples "-DBUILD_OSG_EXAMPLES=ON";

  meta = with lib; {
    description = "3D graphics toolkit";
    homepage = "http://www.openscenegraph.org/";
    maintainers = with maintainers; [
      aanderse
      raskin
    ];
    platforms = with platforms; linux ++ darwin;
    license = with lib.licenses; [
      lgpl21Only
      wxWindowsException31
    ];
  };
}
